home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 3.iso / dist / fw_qt3.idb / usr / freeware / Qt / examples / demo / opengl / gltexobj.cpp.z / gltexobj.cpp
C/C++ Source or Header  |  2002-04-08  |  5KB  |  202 lines

  1. /****************************************************************************
  2. ** $Id:  qt/gltexobj.cpp   3.0.3   edited Oct 12 12:18 $
  3. **
  4. ** Copyright (C) 1992-2000 Trolltech AS.  All rights reserved.
  5. **
  6. ** This file is part of an example program for Qt.  This example
  7. ** program may be used, distributed and modified without limitation.
  8. **
  9. *****************************************************************************/
  10.  
  11. /****************************************************************************
  12. **
  13. ** This is a simple QGLWidget demonstrating the use of QImages for textures.
  14. **
  15. ** Much of the GL code is inspired by the 'spectex' and 'texcyl'
  16. ** public domain demo programs by Brian Paul
  17. **
  18. ****************************************************************************/
  19.  
  20. #include "gltexobj.h"
  21. #include <qimage.h>
  22. #ifdef Q_WS_MAC
  23. #include <glu.h>
  24. #else
  25. #include <GL/glu.h>
  26. #endif
  27.  
  28. /*!
  29.   Create a GLTexobj widget
  30. */
  31.  
  32. GLTexobj::GLTexobj( QWidget* parent, const char* name, WFlags f )
  33.     : GLControlWidget( parent, name, 0, f ), impX( -2 ), impY( 0.5 ), impZ( 1 )
  34. {
  35.     object = 0;
  36. }
  37.  
  38. /*!
  39.   Release allocated resources
  40. */
  41.  
  42. GLTexobj::~GLTexobj()
  43. {
  44.     makeCurrent();
  45.     glDeleteLists( object, 1 );
  46. }
  47.  
  48.  
  49. /*!
  50.   Paint the texobj. The actual openGL commands for drawing the texobj are
  51.   performed here.
  52. */
  53.  
  54. void GLTexobj::paintGL()
  55. {
  56.     glClear( GL_COLOR_BUFFER_BIT );
  57.     glPushMatrix();
  58.     transform();
  59.     glCallList( object );
  60.     glPopMatrix();
  61. }
  62.  
  63.  
  64. /*!
  65.   Set up the OpenGL rendering state, and define display list
  66. */
  67.  
  68. void GLTexobj::initializeGL()
  69. {
  70.     // Set up the lights
  71.  
  72.     GLfloat whiteDir[4] = {2.0, 2.0, 2.0, 1.0};
  73.     GLfloat whiteAmb[4] = {1.0, 1.0, 1.0, 1.0};
  74.     GLfloat lightPos[4] = {30.0, 30.0, 30.0, 1.0};
  75.  
  76.     glEnable(GL_LIGHTING);
  77.     glEnable(GL_LIGHT0);
  78.     glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
  79.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, whiteAmb);
  80.  
  81.     glMaterialfv(GL_FRONT, GL_DIFFUSE, whiteDir);
  82.     glMaterialfv(GL_FRONT, GL_SPECULAR, whiteDir);
  83.     glMaterialf(GL_FRONT, GL_SHININESS, 20.0);
  84.  
  85.     glLightfv(GL_LIGHT0, GL_DIFFUSE, whiteDir);        // enable diffuse
  86.     glLightfv(GL_LIGHT0, GL_SPECULAR, whiteDir);    // enable specular
  87.     glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
  88.  
  89.     // Set up the textures
  90.  
  91.     QImage tex1, tex2, buf;
  92.  
  93.     if ( !buf.load( "opengl/gllogo.bmp" ) ) {    // Load first image from file
  94.     qWarning( "Could not read image file, using single-color instead." );
  95.     QImage dummy( 128, 128, 32 );
  96.     dummy.fill( Qt::green.rgb() );
  97.     buf = dummy;
  98.     }
  99.     tex1 = QGLWidget::convertToGLFormat( buf );  // flipped 32bit RGBA
  100.  
  101.     if ( !buf.load( "opengl/qtlogo.bmp" ) ) {    // Load first image from file
  102.     qWarning( "Could not read image file, using single-color instead." );
  103.     QImage dummy( 128, 128, 32 );
  104.     dummy.fill( Qt::red.rgb() );
  105.     buf = dummy;
  106.     }
  107.     tex2 = QGLWidget::convertToGLFormat( buf );  // flipped 32bit RGBA
  108.  
  109.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
  110.     glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
  111.     glEnable( GL_TEXTURE_2D );
  112.  
  113.     // Set up various other stuff
  114.  
  115.     glClearColor( 0.0, 0.0, 0.0, 0.0 ); // Let OpenGL clear to black
  116.     glEnable( GL_CULL_FACE );      // don't need Z testing for convex objects
  117.     glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
  118.  
  119.     // Make the object display list
  120.  
  121.     object = makeObject( tex1, tex2 );    // Generate an OpenGL display list
  122. }
  123.  
  124.  
  125.  
  126. /*!
  127.   Set up the OpenGL view port, matrix mode, etc.
  128. */
  129.  
  130. void GLTexobj::resizeGL( int w, int h )
  131. {
  132.     glViewport( 0, 0, w, h );
  133.     glMatrixMode( GL_PROJECTION );
  134.     glLoadIdentity();
  135.     glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
  136.     glMatrixMode( GL_MODELVIEW );
  137.     glLoadIdentity();
  138.     glTranslatef( 0.0, 0.0, -70.0 );
  139. }
  140.  
  141.  
  142. /*!
  143.   Generate an OpenGL display list for the object to be shown, i.e. the texobj
  144. */
  145.  
  146. GLuint GLTexobj::makeObject( const QImage& tex1, const QImage& tex2 )
  147. {
  148.     GLUquadricObj* q = gluNewQuadric();
  149.     GLuint cylinderObj = glGenLists(1);
  150.     glNewList( cylinderObj, GL_COMPILE );
  151.  
  152.     glTranslatef( 0.0, 0.0, -1.0 );
  153.  
  154.     // cylinder
  155.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex1.width(), tex1.height(), 0,
  156.           GL_RGBA, GL_UNSIGNED_BYTE, tex1.bits() );
  157.     gluQuadricTexture( q, GL_TRUE );
  158.     gluCylinder(q, 0.6, 0.6, 2.0, 24, 1);
  159.  
  160.     // end cap
  161.     glTexImage2D( GL_TEXTURE_2D, 0, 3, tex2.width(), tex2.height(), 0,
  162.           GL_RGBA, GL_UNSIGNED_BYTE, tex2.bits() );
  163.     glTranslatef( 0.0, 0.0, 2.0 );
  164.     gluDisk( q, 0.0, 0.6, 24, 1 );
  165.  
  166.     // other end cap
  167.     glTranslatef( 0.0, 0.0, -2.0 );
  168.     gluQuadricOrientation( q, (GLenum)GLU_INSIDE );
  169.     gluDisk( q, 0.0, 0.6, 24, 1 );
  170.  
  171.     glEndList();
  172.     gluDeleteQuadric( q );
  173.  
  174.     return cylinderObj;
  175. }
  176.  
  177. void GLTexobj::animate()
  178. {
  179.     xRot += impX;
  180.     yRot += impY;
  181.     zRot -= impZ;
  182.  
  183.     impX -= impX * 0.05;
  184.     impY -= impY * 0.05;
  185.     impZ -= impZ * 0.05;
  186.  
  187.     if ( impX > 0.1 || impY > 0.1 || impZ > 0.1 || 
  188.      impX < -0.1 || impY < -0.1 || impZ < -0.1 )
  189.     updateGL();
  190. }
  191.  
  192. void GLTexobj::setRotationImpulse( double x, double y, double z )
  193. {
  194.     if ( animation ) {
  195.     impX += 180*x;
  196.     impY += 180*y;
  197.     impZ += 180*z;
  198.     } else {
  199.     GLControlWidget::setRotationImpulse( x, y, z );
  200.     }
  201. }
  202.